#!/usr/bin/env python3
import re
import uuid
import sys
import os
import argparse

# 获取设备的 MAC 地址，使用 UUID 模块
def get_mac_uuid():
    # 使用 uuid 模块获取设备的硬件地址（物理地址）
    return ':'.join(re.findall('..', '%012x' % uuid.getnode()))

# 获取 MAC 地址，使用 ip 命令
def get_mac_ip(iface):
    # 使用 ip 命令显示接口信息，查找 MAC 地址
    result = os.popen(f"ip link show {iface}").read()
    match = re.search(r'link/ether ([0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5})', result)
    # 如果找到 MAC 地址，返回
    if match:
        return match.group(1)
    return None

# 获取 MAC 地址，使用 ifconfig 命令
def get_mac_ifconfig(iface):
    # 使用 ifconfig 命令显示接口信息，查找 MAC 地址
    result = os.popen(f"ifconfig {iface}").read()
    match = re.search(r'ether ([0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5})', result)
    # 如果找到 MAC 地址，返回
    if match:
        return match.group(1)
    return None

# 获取 MAC 地址，使用 sysfs 文件系统
def get_mac_sysfs(iface):
    # 读取 /sys/class/net/{iface}/address 文件来获取 MAC 地址
    path = f"/sys/class/net/{iface}/address"
    if os.path.exists(path):
        with open(path, 'r') as file:
            return file.read().strip()
    return None

# 显示帮助信息
def show_help():
    print("""
    用法:
      get_mac_address.py [options]

    获取 MAC 地址的几种方法：
    1. UUID 模块
    2. ip 命令
    3. ifconfig 命令
    4. sysfs 文件系统

    选项:
      -h, --help       显示此帮助信息
      -i, --interface  指定网络接口名称（默认自动获取默认接口）
    """)

# 主函数，执行脚本逻辑
def main():
    # 解析命令行参数
    parser = argparse.ArgumentParser(description="获取 MAC 地址")
    parser.add_argument("-i", "--interface", help="指定网络接口名称", default=None)
    args = parser.parse_args()

    # 如果用户输入 --help 或 -h，显示帮助信息
    if args.interface is None:
        # 如果没有传入接口名，尝试获取默认接口名称
        iface = os.popen("ip route | grep default | awk '{print $5}'").read().strip()
    else:
        # 使用用户指定的接口名
        iface = args.interface

    print(f"尝试获取接口 {iface} 的 MAC 地址：")

    # 执行四种方法来获取 MAC 地址
    macs = [
        ('UUID模块', get_mac_uuid()),  # 使用 UUID 模块获取 MAC 地址
        ('ip命令', get_mac_ip(iface)),      # 使用 ip 命令获取 MAC 地址
        ('ifconfig命令', get_mac_ifconfig(iface)),  # 使用 ifconfig 命令获取 MAC 地址
        ('sysfs文件', get_mac_sysfs(iface))  # 使用 sysfs 文件系统获取 MAC 地址
    ]

    # 打印每种方法的结果
    for method, mac in macs:
        if mac:
            print(f"方法：{method} -> MAC地址：{mac}")
        else:
            print(f"方法：{method} -> 未获取到MAC地址")

    # 一致性检查：检查所有方法得到的 MAC 地址是否一致
    valid_macs = [mac for _, mac in macs if mac]
    if len(valid_macs) == 0:
        print("未能通过任何方法获取MAC地址。")
    elif len(set(valid_macs)) == 1:
        print(f"所有方法获取的MAC地址一致：{valid_macs[0]}")
    else:
        print("方法结果不一致，请手动检查：")
        for i, (method, mac) in enumerate(macs):
            if mac:
                print(f"方法{i+1} -> MAC地址：{mac}")

# 如果脚本是作为主程序执行，则调用 main() 函数
if __name__ == "__main__":
    main()
